package com.aliyun.pojo.pay;

import com.alipay.v3.model.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * 支付宝扫码支付参数类
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AliyunPayTradeParam {
    public static final String DEFAULT_PRODUCT_CODE = "FAST_INSTANT_TRADE_PAY";
    public static final String DEFAULT_INTEGRATION_TYPE = "PCWEB";
    public static final Integer DEFAULT_QR_PAT_MODE = 1;

    private String out_trade_no;    // 商户订单号。必选
    private BigDecimal total_amount;    // 订单总金额，单位为元。必选
    private String subject;    // 订单标题。，单位为元。必选

    public AliyunPayTradeParam(String out_trade_no, BigDecimal total_amount, String subject) {
        this.out_trade_no = out_trade_no;
        this.total_amount = total_amount;
        this.subject = subject;
    }

    private String product_code = DEFAULT_PRODUCT_CODE;    // 销售产品码，与支付宝签约的产品码名称。，单位为元。必选
    /**
     * 0：订单码-简约前置模式，对应 iframe 宽度不能小于600px，高度不能小于300px；
     * 1：订单码-前置模式，对应iframe 宽度不能小于 300px，高度不能小于600px；
     * 3：订单码-迷你前置模式，对应 iframe 宽度不能小于 75px，高度不能小于75px；
     * 4：订单码-可定义宽度的嵌入式二维码，商户可根据需要设定二维码的大小。
     * 跳转模式下，用户的扫码界面是由支付宝生成的，不在商户的域名下。支持传入的枚举值有：
     */
    private Integer qr_pay_mode = DEFAULT_QR_PAT_MODE;
    private Integer qrcode_width;   // 商户自定义二维码宽度
    /**
     * 订单包含的商品列表信息，json格式
     *  goods_id : 商品的编号
     *  goods_name : 商品名称
     *  quantity : 商品数量
     *  price : 商品单价，单位为元
     *  alipay_goods_id : 支付宝定义的统一商品编号 可选
     *  goods_category : 商品类目 可选
     *  categories_tree : 商品类目树，从商品类目根节点到叶子节点的类目id组成，类目id值使用|分割 可选
     *  show_url : 商品的展示地址 可选
     */
    private GoodsDetail[] goods_detail;
    private String time_expire = defaultTimeExpire(); // 订单绝对超时时间 格式为yyyy-MM-dd HH:mm:ss。超时时间范围：1m~15d。
    private SubMerchant sub_merchant;    // 二级商户信息
    private ExtendParams extend_params; // 业务扩展参数
    private String business_params; // 商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式
    private String promo_params;    // 优惠参数。为 JSON 格式。注：仅与支付宝协商后可用
    /**
     * 请求后页面的集成方式。
     * 枚举值：
     * ALIAPP：支付宝钱包内
     * PCWEB：PC端访问 默认
     */
    private String integration_type = DEFAULT_INTEGRATION_TYPE;
    private String request_from_url; // 请求来源地址。如果使用ALIAPP的集成方式，用户中途取消支付会返回该地址

    private String store_id;    // 商户门店编号。 指商户创建门店时输入的门店编号。
    private String merchant_order_no;   // 商户原始订单号，最大长度限制 32 位
    /**
     * 外部指定买家
     */
    private ExtUserInfo ext_user_info;
    /**
     * 开票信息
     */
//    private InvoiceInfo invoiceInfo;

    /**
     * 订单有效时间30分钟
     * @return
     */
    public String defaultTimeExpire(){
        // 追加30分钟
        return LocalDateTime.now().plus(30, ChronoUnit.MINUTES).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 订单有效时间 单位分钟
     * @return
     */
    public void setTimeExpire(long amountToAdd){
        this.time_expire = LocalDateTime.now().plus(amountToAdd, ChronoUnit.MINUTES).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}
